AWS CLIオプションの簡略記法でハッシュ階層を記述する
ども、大瀧です。
先日、AWS CLIのバージョン1.8がリリースされ、オプションの簡略記法でハッシュ階層を記述することができるようになりました。オプションの簡略記法でハッシュ階層を記述と言っても、なにがなんだかという感じだと思いますので、例示しつつ説明してみたいと思います。
簡略記法(Shorthand Syntax)とこれまでの制約
AWS CLIのオプションで複雑な指定をするために、簡略記法(Shorthand Syntax)とJSON記法(JSON Syntax)の2種類を使うことができます。名前の通り簡略記法の方が簡単に記述できる一方で、簡略記法では以下の形式で単一階層しか表現することができず、ハッシュ階層を指定するオプションではJSON記法しか利用できないという制約がありました。
--<オプション名> <キー1>=<値1>,<キー2>=<値2>
例えば、AWS CLIの旧バージョンでのaws ec2 run-instances help
(コマンドマニュアル)の--block-device-mappings
オプション(ハッシュ階層の例)と--monitoring
オプション(単一階層の例)を以下に示します。
--block-device-mappings (list) The block device mapping. JSON Syntax: [ { "VirtualName": "string", "DeviceName": "string", "Ebs": { "SnapshotId": "string", "VolumeSize": integer, "DeleteOnTermination": true|false, "VolumeType": "standard"|"io1"|"gp2", "Iops": integer, "Encrypted": true|false }, "NoDevice": "string" } ... ]
--monitoring (structure) The monitoring for the instance. Shorthand Syntax: --monitoring Enabled=value JSON Syntax: { "Enabled": true|false }
--monitoring
オプションにはShorthand SyntaxとJSON Syntaxの両方の例があるのに対し、--block-device-mappings
オプションはハッシュ階層を指定しなければならないため、非対応のShorthand Syntaxの記載が無く、JSON Syntaxのみになっていることがわかりますね。
今回のバージョン1.8でShorthand Syntaxの書式が拡張され、ハッシュ階層が記述できるようになりました。
記述例
Shorthand Syntaxでハッシュ階層を指定する場合、親要素はこれまでと同様<親キー>=<値>
とし、値に子要素を入れるために{}
(ブレース)で囲んで表現します。子要素のハッシュも<子キー>=<値>
と記述します。以下のような感じで、Ebs
の子要素としてVolumeSize
を指定します。
Shorthand Syntaxの場合
$ aws ec2 run-instances --image-id ami-1c1b9f1c --instance-type t2.micro --block-device-mappings \ DeviceName=/dev/xvda,Ebs={VolumeSize=10} DeviceName=/dev/xvdb,Ebs={VolumeSize=10}
いい感じですね。構造がよくわからないという方は、JSON Syntaxと比較いただくのが良いでしょう。
JSON Syntaxの場合
$ aws ec2 run-instances --image-id ami-1c1b9f1c --instance-type t2.micro --block-device-mappings \ '[ { "DeviceName": "/dev/xvda", "Ebs": { "VolumeSize": 10 } }, { "DeviceName": "/dev/xvdb", "Ebs": { "VolumeSize": 10 } } ]'
ちなみに、記法のサンプルが見たい場合はAWS CLIのテストケースが参考になると思います。
まとめ
端末での実行やシェルスクリプトに記述する際、JSONでは文字のエスケープなどに気を遣うことが多かったですがShorthand Syntaxであればより簡易に書けるようになっているので、便利な場面があるのではと期待しています。